Учебный курс: Подготовка на 1С:Специалист по платформе 1С:Предприятие 8.3

Задачи оперативного учета – тема № 3:
Как реализовать обработчики проведения документов для подбора ближайших ячеек при адресном хранении номенклатуры

Продолжаем решать задачу по реализации адресного хранения товаров на складах.

Как сформировать движения по регистру для расходной накладной

В документе «Приходная накладная» явно указывается номер ряда и номер стеллажа, поэтому для формирования движений можно было использовать конструктор движений.

В документе «Расходная накладная» необходимо подбирать ближайшие ячейки, потребуется не просто обойти строки табличной части документа, а получить данные из базы при помощи запроса, обработать их. Поэтому реализовать обработчик проведения только при помощи конструктора движений не получится. Значит, вручную создадим в модуле документа процедуру ОбработкаПроведения. В ней получим остатки товаров на складах, из них возьмем ячейки с минимальным расстоянием.

Код обработки проведения выглядит следующим образом:

Процедура ОбработкаПроведения(Отказ, РежимПроведения) // 1. Подготовка наборов записей регистра Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Записать(); // 2. Установка признака записи у регистра Движения.ОстаткиНоменклатуры.Записывать = Истина; // 3. Установка управляемой блокировки Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); // 4. Запрос, в котором группируются данные табличной части и получаются остатки Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧТовары |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧТовары.Номенклатура КАК Номенклатура, | ТЧТовары.Номенклатура.Представление КАК НоменклатураПредставление, | ТЧТовары.Количество КАК Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Стеллаж, 0) КАК Стеллаж, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Ряд, 0) КАК Ряд, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Ряд, 0) + ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Стеллаж, 0) КАК Расстояние |ИЗ | ТЧТовары КАК ТЧТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ТЧТовары.Номенклатура | ИЗ | ТЧТовары КАК ТЧТовары)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧТовары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Расстояние |ИТОГИ | МАКСИМУМ(Количество), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; // 5. Определение момента времени для получения остатков Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); // 6. Цикл по номенклатуре документа ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // 7. Контроль остатков Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не хватает остатка по номенклатуре " + ВыборкаНоменклатура.НоменклатураПредставление; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; // 8. Остатка не хватает, нет смысла формировать движения Если Отказ Тогда Продолжить; КонецЕсли; // 9. Получим количество для списания КоличествоСписать = ВыборкаНоменклатура.Количество; // 10. Цикл по складским ячейкам ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() И КоличествоСписать <> 0 Цикл // 11. Расчет количества для списания Количество = Мин(КоличествоСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток); // 12. Уменьшим количество для списания КоличествоСписать = КоличествоСписать - Количество; // 13. Сформируем движение Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Стеллаж = ВыборкаДетальныеЗаписи.Стеллаж; Движение.Ряд = ВыборкаДетальныеЗаписи.Ряд; Движение.Количество = Количество; КонецЦикла; КонецЦикла; КонецПроцедуры

Рассмотрим ключевые точки алгоритма.

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии закрыты